/*  
 * forkdemo3.c - 展示如何使用 fork() 的返回值来确定  
 *              一个进程是子进程还是父进程  
 */  

#include <stdio.h>      // 标准输入输出头文件  
#include <unistd.h>     // 提供 fork() 和 getpid() 等函数  
#include <sys/types.h>  // 定义 pid_t 类型  
#include <stdlib.h>     // 提供 exit() 函数  

int main(void)  
{  
    pid_t fork_rv;  // fork() 的返回值  

    // 在创建新进程之前，打印当前进程的 PID  
    printf("之前: 我的 PID 是 %d\n", getpid());  

    fork_rv = fork();  /* 创建新进程 */  

    if (fork_rv == -1) {  /* 检查是否创建子进程时出错 */  
        perror("fork 失败");  
        exit(EXIT_FAILURE);  
    }  
    else if (fork_rv == 0) {  // 子进程的执行路径  
        printf("我是子进程。我的 PID 是 %d\n", getpid());  
    }  
    else {  // 父进程的执行路径  
        printf("我是父进程。我的子进程 PID 是 %d\n", fork_rv);  
    }  

    return 0;  // 正常退出  
}